#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简单的Nuitka打包脚本
用于MySQLPass程序的快速打包
"""

import os
import sys
import subprocess
import time

# 项目基本信息
PROJECT_NAME = "MySQLPass"
MAIN_SCRIPT = "main.py"
OUTPUT_EXE = f"{PROJECT_NAME}.exe"


def build_with_nuitka():
    """使用Nuitka简单打包程序"""
    print(f"\n开始使用Nuitka打包{PROJECT_NAME}...")
    print(f"当前时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
    print("=" * 60)
    
    # 构建基础的Nuitka命令
    cmd = [
        sys.executable,
        "-m", "nuitka",
        # 基础配置
        MAIN_SCRIPT,
        "--onefile",               # 单文件模式
        f"--output-filename={OUTPUT_EXE}",  # 输出文件名
        # 编译器设置
        "--mingw64",               # 让Nuitka自动下载和使用MinGW编译器
        # 插件设置
        "--plugin-enable=tk-inter", # 启用tkinter插件
        # 包含必要的包
        "--include-package=src",
        "--include-package=pymysql",
        "--include-package=PIL",
    ]
    
    print(f"执行命令:\n{' '.join(cmd)}")
    print("=" * 60)
    print("打包过程中，请耐心等待。对于包含GUI和多个依赖的应用，这可能需要几分钟时间...")
    print("\n打包阶段提示:")
    print("1. 分析导入 (Analyzing imports)")
    print("2. 生成C代码 (Generating C source code)")
    print("3. 编译C代码 (Compiling C code)")
    print("4. 链接和打包 (Linking and packaging)")
    print("=" * 60)
    
    try:
        # 执行Nuitka命令
        start_time = time.time()
        process = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            bufsize=1
        )
        
        # 实时显示输出
        for line in process.stdout:
            if line.strip():
                print(line.strip())
        
        # 等待进程完成
        process.wait()
        end_time = time.time()
        
        # 检查退出代码
        if process.returncode == 0:
            print(f"\n{'=' * 60}")
            print(f"✅ {PROJECT_NAME} 打包成功！")
            print(f"总耗时: {end_time - start_time:.2f} 秒")
            
            # 检查生成的可执行文件
            if os.path.exists(OUTPUT_EXE):
                print(f"可执行文件位置: {os.path.abspath(OUTPUT_EXE)}")
                print(f"文件大小: {os.path.getsize(OUTPUT_EXE) / (1024 * 1024):.2f} MB")
                print(f"\n提示: 您可以直接运行 {OUTPUT_EXE} 来启动程序。")
            else:
                print("❌ 未找到生成的可执行文件！")
                
            return True
        else:
            print(f"\n{'=' * 60}")
            print(f"❌ {PROJECT_NAME} 打包失败！退出代码: {process.returncode}")
            return False
    except Exception as e:
        print(f"\n{'=' * 60}")
        print(f"❌ 打包过程中发生错误: {e}")
        return False


def main():
    """主函数"""
    # 检查是否已安装Nuitka
    try:
        import nuitka
        print("已安装Nuitka！")
    except ImportError:
        print("未安装Nuitka！正在尝试安装...")
        try:
            subprocess.run([sys.executable, "-m", "pip", "install", "nuitka"], check=True)
            print("Nuitka安装成功！")
        except subprocess.CalledProcessError:
            print("❌ Nuitka安装失败！请手动安装后重试。")
            print("安装命令: python -m pip install nuitka")
            sys.exit(1)
    
    # 执行打包
    success = build_with_nuitka()
    
    # 输出最终提示
    if not success:
        print("\n建议尝试的解决方法:")
        print("1. 确保已安装所有依赖: pip install -r requirements_utf8.txt")
        print("2. 检查是否有足够的磁盘空间和内存")
        print("3. 尝试使用管理员权限运行命令提示符")
        print("4. 如果问题仍然存在，可以使用PyInstaller作为替代: python simple_build.py")
    
    print(f"\n打包过程结束于: {time.strftime('%Y-%m-%d %H:%M:%S')}")


if __name__ == "__main__":
    main()